
// 给定两个字符串 s1 和 s2，写一个函数来判断 s2 是否包含 s1 的排列。
// 换句话说，第一个字符串的排列之一是第二个字符串的子串。





// 示例1:
// 输入: s1 = "ab" s2 = "eidbaooo"
// 输出: True
// 解释: s2 包含 s1 的排列之一 ("ba").
 

// 示例2:
// 输入: s1= "ab" s2 = "eidboaoo"
// 输出: False


/**
 * @param {string} s1
 * @param {string} s2
 * @return {boolean}
 */
var checkInclusion = function (s1, s2) {
    let
        left = 0,
        right = 0,
        valid = 0,
        need = {},
        window = {};
    s1.split('').forEach(item => {
        if (need[item] === undefined) {
            need[item] = 1;
        } else {
            need[item]++;
        }
        if (window[item] === undefined) {
            window[item] = 0;
        }
    });
    while (right < s2.length) {
        let right_curchar = s2[right];
        right++;
        if (need[right_curchar] !== undefined) {
            window[right_curchar]++;
            if (need[right_curchar] === window[right_curchar]) {
                valid++;
            }
        }
        // left滑动的收缩的条件是right右滑到长度等于target的串长
        if ((right - left) >= s1.length) {
            // 滑动前，判断是否valid符合条件，符合返回true
            if (valid === [...Object.keys(need)].length) return true;
            let left_curchar = s2[left];
            left++;
            if (need[left_curchar] !== undefined) {
                if (need[left_curchar] === window[left_curchar]) {
                    valid--;
                }
                window[left_curchar]--;
            }
        }
    }
    return false;
};